package com.test.reader;

import com.test.registry.BeanDefinitionRegistry;
import com.test.resource.DefaultResourceLoader;
import com.test.resource.Resource;
import com.test.resource.ResourceLoader;

/**
 * AbstractBeanDefinitionReader类是Bean定义读取器的抽象实现，
 * 它提供了Bean定义加载的基础结构，包括Bean定义注册表和资源加载器的管理。
 */
public abstract class AbstractBeanDefinitionReader implements BeanDefinitionReader{

    // Bean定义注册表，用于存储和管理Bean定义
    private final BeanDefinitionRegistry registry;
    // 资源加载器，用于加载资源文件
    private ResourceLoader resourceLoader;

    /**
     * 构造函数，初始化Bean定义注册表和默认的资源加载器
     * @param registry Bean定义注册表
     */
    protected AbstractBeanDefinitionReader(BeanDefinitionRegistry registry) {
        this.registry = registry;
        this.resourceLoader = new DefaultResourceLoader();
    }

    /**
     * 构造函数，初始化Bean定义注册表和指定的资源加载器
     * @param registry Bean定义注册表
     * @param resourceLoader 资源加载器
     */
    protected AbstractBeanDefinitionReader(BeanDefinitionRegistry registry, ResourceLoader resourceLoader) {
        this.registry = registry;
        this.resourceLoader = resourceLoader;
    }

    /**
     * 获取Bean定义注册表
     * @return BeanDefinitionRegistry对象
     */
    @Override
    public BeanDefinitionRegistry getRegistry() {
        return registry;
    }

    /**
     * 设置资源加载器
     * @param resourceLoader 资源加载器
     */
    public void setResourceLoader(ResourceLoader resourceLoader){
        this.resourceLoader = resourceLoader;
    }

    /**
     * 加载多个位置的Bean定义
     * @param locations 资源位置数组
     * @throws Exception 如果加载过程中发生错误
     */
    @Override
    public void loadBeanDefinitions(String... locations) throws Exception {
        for (String location : locations){
            loadBeanDefinitions(location);
        }
    }

    /**
     * 加载多个资源的Bean定义
     * @param resources 资源数组
     * @throws Exception 如果加载过程中发生错误
     */
    @Override
    public void loadBeanDefinitions(Resource... resources) throws Exception {
        for (Resource resource : resources){
            loadBeanDefinitions(resource);
        }
    }

    /**
     * 根据资源位置加载Bean定义
     * @param location 资源位置
     * @throws Exception 如果加载过程中发生错误
     */
    @Override
    public void loadBeanDefinitions(String location) throws Exception {
        Resource resource = getResourceLoader().getResource(location);
        loadBeanDefinitions(resource);
    }

    /**
     * 获取资源加载器
     * @return ResourceLoader对象
     */
    public ResourceLoader getResourceLoader() {
        return resourceLoader;
    }
}
